/* jFeed : jQuery feed parser plugin
 * Copyright (C) 2007 Jean-François Hovinne - http://www.hovinne.com/
 * Dual licensed under the MIT (MIT-license.txt)
 * and GPL (GPL-license.txt) licenses.
 */

jQuery.getFeed = function(options) {

	options = jQuery.extend({

		url : null,
		data : null,
		cache : true,
		success : null,
		failure : null,
		error : null,
		global : true

	}, options);

	if (options.url) {

		if (jQuery.isFunction(options.failure) && jQuery.type(options.error) === 'null') {
			// Handle legacy failure option
			options.error = function(xhr, msg, e) {
				options.failure(msg, e);
			}
		} else if (jQuery.type(options.failure) === jQuery.type(options.error) === 'null') {
			// Default error behavior if failure & error both unspecified
			options.error = function(xhr, msg, e) {
				window.console && console.log('getFeed failed to load feed', xhr, msg, e);
			}
		}
		return $.ajax({
			type : 'GET',
			url : options.url,
			data : options.data,
			cache : options.cache,
			dataType : (jQuery.browser.msie) ? "text" : "xml",
			success : function(xml) {
				var feed = new JFeed(xml);
				if (jQuery.isFunction(options.success))
					options.success(feed);
			},
			error : options.error,
			global : options.global
		});
	}
};

function JFeed(xml) {
	if (xml)
		this.parse(xml);
};

JFeed.prototype = {

	type : '',
	version : '',
	title : '',
	link : '',
	description : '',
	parse : function(xml) {

		if (jQuery.browser.msie) {
			var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
			xmlDoc.loadXML(xml);
			xml = xmlDoc;
		}

		if (jQuery('channel', xml).length == 1) {

			this.type = 'rss';
			var feedClass = new JRss(xml);

		} else if (jQuery('feed', xml).length == 1) {

			this.type = 'atom';
			var feedClass = new JAtom(xml);
		}

		if (feedClass)
			jQuery.extend(this, feedClass);
	}
};

function JFeedItem() {
};

JFeedItem.prototype = {

	title : '',
	link : '',
	description : '',
	updated : '',
	id : ''
};

function JAtom(xml) {
	this._parse(xml);
};

JAtom.prototype = {

	_parse : function(xml) {

		var channel = jQuery('feed', xml).eq(0);

		this.version = '1.0';
		this.title = jQuery(channel).find('title:first').text();
		this.link = jQuery(channel).find('link:first').attr('href');
		this.description = jQuery(channel).find('subtitle:first').text();
		this.language = jQuery(channel).attr('xml:lang');
		this.updated = jQuery(channel).find('updated:first').text();

		this.items = new Array();

		var feed = this;

		jQuery('entry', xml).each(function() {

			var item = new JFeedItem();

			item.title = jQuery(this).find('title').eq(0).text();
			item.link = jQuery(this).find('link').eq(0).attr('href');
			item.description = jQuery(this).find('content').eq(0).text();
			item.updated = jQuery(this).find('updated').eq(0).text();
			item.id = jQuery(this).find('id').eq(0).text();

			feed.items.push(item);
		});
	}
};

function JRss(xml) {
	this._parse(xml);
};

JRss.prototype = {

	_parse : function(xml) {

		if (jQuery('rss', xml).length == 0)
			this.version = '1.0';
		else
			this.version = jQuery('rss', xml).eq(0).attr('version');

		var channel = jQuery('channel', xml).eq(0);

		this.title = jQuery(channel).find('title:first').text();
		this.link = jQuery(channel).find('link:first').text();
		this.description = jQuery(channel).find('description:first').text();
		this.language = jQuery(channel).find('language:first').text();
		this.updated = jQuery(channel).find('lastBuildDate:first').text();

		this.items = new Array();

		var feed = this;

		jQuery('item', xml).each(function() {

			var item = new JFeedItem();

			item.title = jQuery(this).find('title').eq(0).text();
			item.link = jQuery(this).find('link').eq(0).text();
			item.description = jQuery(this).find('description').eq(0).text();
			item.updated = jQuery(this).find('pubDate').eq(0).text();
			item.id = jQuery(this).find('guid').eq(0).text();

			feed.items.push(item);
		});
	}
};
